package com.xm.queue.task2;

import com.xm.util.StringUtil;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 测试结果
 * 00:45:52.197 [Thread-1] INFO com.xm.queue.task2.TaskManager - 正在创建任务队列 LinkedBlockingQueue，是否限流 = true，是否公平竞争 = null
 * 00:45:52.215 [pool-1-thread-2] INFO com.xm.queue.task2.TaskWorker - 工人[1]已上线，正在加班加点工作。。
 * 00:45:52.215 [pool-1-thread-3] INFO com.xm.queue.task2.TaskWorker - 工人[2]已上线，正在加班加点工作。。
 * 00:45:52.215 [pool-1-thread-4] INFO com.xm.queue.task2.TaskWorker - 工人[3]已上线，正在加班加点工作。。
 * 00:45:52.216 [pool-1-thread-5] INFO com.xm.queue.task2.TaskWorker - 工人[4]已上线，正在加班加点工作。。
 * 00:45:52.216 [pool-1-thread-6] INFO com.xm.queue.task2.TaskWorker - 工人[5]已上线，正在加班加点工作。。
 * 00:45:52.215 [pool-1-thread-1] INFO com.xm.queue.task2.TaskWorker - 工人[0]已上线，正在加班加点工作。。
 * 00:45:52.216 [pool-1-thread-7] INFO com.xm.queue.task2.TaskWorker - 工人[6]已上线，正在加班加点工作。。
 * 00:45:52.216 [pool-1-thread-8] INFO com.xm.queue.task2.TaskWorker - 工人[7]已上线，正在加班加点工作。。
 * Progress：实际消费任务/队列任务/实际接收任务
 * Progress：200/0/200
 * 00:46:04.926 [main] INFO com.xm.queue.task2.TestTask - 耗时：11752ms
 * 00:46:04.926 [main] INFO com.xm.queue.task2.TaskExecutor - 正在关闭线程池资源...
 * 00:46:09.927 [main] INFO com.xm.queue.task2.TaskExecutor - 已关闭线程池资源！
 * Process finished with exit code 0
 */
@Slf4j
public class TestTask {
    private static final AtomicInteger no = new AtomicInteger(0);

    public static void main(String[] args) {
//        TaskUtil.addTask(new AsyncTask("test"));

        int times = 4;
        int batch = 50;
        for (int i = 0; i < times; i++) {
            try {
                new Thread(() -> {
                    make(batch);
                }).start();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }

        try {
            Thread.sleep(1000L);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("\nProgress：实际消费任务/队列任务/实际接收任务");

        // 模拟消费进度
        long start = System.currentTimeMillis();
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            try {
                Thread.sleep(10L);
                // 使用 \r 覆盖当前行，不换行

                System.out.printf("\rProgress：%d/%d/%d", TaskWorker.count.intValue(), TaskUtil.getQueueSize(), no.intValue());

                if(TaskWorker.count.intValue() == times*batch) {
                    System.out.println();
                    break;
                }
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
        log.info("耗时：{}ms", System.currentTimeMillis() - start);

        TaskExecutor.shutdown();
    }

    public static void make(int num) {
        for (int i = 0; i < num; i++) {
            TaskUtil.addTask(new AsyncTask("Task-" + StringUtil.formatZero(no.incrementAndGet(), 5)));
        }
    }
}
